from importlib import import_module

from flask import Flask
from flask_babelex import Babel

from cc_flask import urls, error_handler
from cc_flask.models import db
# from cc_flask.migrate import migrate
from cc_flask.admin import admin, init_models
from flask_migrate import Migrate
# import app.models  # 必须将需要迁移的models导入到migrate文件，否则迁移时找不到对应的models

# migrate =


def create_app(config=None):
    app = Flask(__name__, instance_relative_config=True)

    # 默认配置，config中没有配置时才会使用这里的配置
    app.config.from_mapping(
        SECRET_KEY='dev',
        SQLALCHEMY_DATABASE_URI='sqlite:///test.db',
        SQLALCHEMY_TRACK_MODIFICATIONS=False,
        FLASK_ADMIN_SWATCH='cerulean',
        BABEL_DEFAULT_LOCALE="zh_CN",
    )

    # 全局异常处理
    app.register_error_handler(Exception, error_handler.error_handler)

    if config:
        app.config.from_object(config)

    [app.register_blueprint(i) for i in urls.blueprints]  # 注册蓝图（路由）

    db.init_app(app)  # 注册db
    Migrate(app, db)  # 注册migrate

    admin.init_app(app)  # 注册admin
    Babel(app)  # 设置中文用的

    # 初始化数据表
    for i in app.config.get("APP"):
        try:
            # 如果migrate不识别表的话，把下面这一行的注释打开即可
            # import_module('%s.models' % i)
            _models = import_module('%s.models' % i)
            init_models(_models)
        except Exception as e:
            if config.DEBUG:
                raise Exception(e)

    return app
